package com.naiterui.ehp.bs.emr.dao.mongo;

import java.util.List;

import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;

/**
 * 基于Spring MongoTemplate的MongoDB操作封装
 * <P>File name : MongoBaseDao.java </P>
 * <P>Author : zhouyanxin </P>
 * <P>Date : 2015年6月28日 </P>
 */
@Deprecated
public abstract class MongoBaseDao {

    /**
     * mongodb template
     */
    protected abstract MongoTemplate getMongoTemplate();

    /**
     * 分页查询
     * MongoBaseDao.find()<BR>
     * <P>Author : zhouyanxin </P>
     * <P>Date : 2014-10-11 </P>
     *
     * @param query
     * @param entityClass
     * @param collectionName
     *
     * @return
     */
    protected <T> List<T> find(Query query, Class<T> entityClass, String collectionName) {
        return this.getMongoTemplate().find(query, entityClass, collectionName);
    }

    /**
     * 查询总数量
     * MongoBaseDao.queryCount()<BR>
     * <P>Author : zhouyanxin </P>
     * <P>Date : 2014-10-11 </P>
     *
     * @param query
     * @param collectionName
     *
     * @return
     */
    protected long queryCount(Query query, String collectionName) {
        return this.getMongoTemplate().count(query, collectionName);
    }

    /**
     * 分页查询 MongoBaseDao.queryByPage()<BR> <P>Author : zhouyanxin </P> <P>Date :
     * 2015年7月4日 </P>
     *
     * @param criteria
     * @param orderBy
     * @param orderByItem
     *
     * @return
     */
    protected <T> List<T> queryByPage(String collectionName, Class<T> entityClass, Criteria criteria, int pageNo, int pageSize, String orderBy,
                                      String orderByItem) {
        int skipNum = (pageNo - 1) * pageSize;
        Query query;
        if ("asc".equals(orderBy)) {
            query = Query.query(criteria).skip(skipNum).limit(pageSize).with(Sort.by(new Sort.Order(Direction.ASC, orderByItem)));
        } else {
            query = Query.query(criteria).skip(skipNum).limit(pageSize).with(Sort.by(new Sort.Order(Direction.DESC, orderByItem)));
        }

        return this.find(query, entityClass, collectionName);
    }

}
